#include "MsgQueue.hpp"

//////////////////////////////////////////////////////////////////////////
CBufQueue::CBufQueue() : m_size(0)
{
//	m_list.resize( 512 );
}

CBufQueue::~CBufQueue()
{
}

bool CBufQueue::empty()
{
	return m_size == 0 ;
}

uint32_t CBufQueue::size()
{
	return m_size;
}

void CBufQueue::push( IMediaBuffer *&buf )
{
	if ( !buf )
		return;
	boost::mutex::scoped_lock locker( m_mutex ); 

	m_list.push_back( buf );
}

bool CBufQueue::pop( IMediaBuffer *&buf )
{
	boost::mutex::scoped_lock locker( m_mutex );
	if ( m_list.size() == 0 )
		return false;
	buf = m_list.front();
	m_list.pop_front();

	return true;
}

// bool CBufQueue::pop( IMediaBuffer *&buf, uint32_t size )
// {
// 	boost::mutex::scoped_lock locker( m_mutex );
// 	if ( size < 0 || m_size < size )
// 		return false;
// 	IMediaBuffer *p = 0, *tail = 0;
// 	uint32_t num = 0;
// 	p = m_list.front();
// 	m_list.pop_front();
// 	buf = p;
// 	tail = p;
// 	num += tail->size();
// 	while ( tail->next() )
// 	{
// 		tail = tail->next();
// 		num += tail->size();
// 	}
// 	while ( num < size )
// 	{
// 		p = m_list.front();
// 		m_list.pop_front();
// 		tail->next( p );
// 		while ( tail->next() )
// 		{
// 			tail = tail->next();
// 			num += tail->size();
// 		}
// 	}
// 
// 	m_size -= num;
// 
// 	return true;
// }

//////////////////////////////////////////////////////////////////////////
CBufList::CBufList() : m_head(0), m_tail(0), m_size(0)
{

}

CBufList::~CBufList()
{

}

bool CBufList::push( IMediaBuffer *&buf )
{
    boost::mutex::scoped_lock locker( m_mutex ); 
    if ( m_size >= BUF_SIZE )
        return false;
    m_buf[m_tail] = buf;
    m_tail = (m_tail+1)%BUF_SIZE;
    ++m_size;
    return true;

}
bool CBufList::pop( IMediaBuffer *&buf )
{
    boost::mutex::scoped_lock locker( m_mutex ); 
    if ( m_size == 0 )
        return false;
    buf = m_buf[m_head];
    m_head = (m_head+1)%BUF_SIZE;
    --m_size;
    return true;
}
// bool CBufList::pop( IMediaBuffer *&buf, uint32_t size )
// {
//     
// }

uint16_t CBufList::size()
{
    return m_size;
}